热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

系数|余弦_科学计算基础软件包NumPy入门讲座:常用函数

篇首语:本文由编程笔记#小编为大家整理,主要介绍了科学计算基础软件包NumPy入门讲座:常用函数相关的知识,希望对你有一定的参考价值。文章目录

篇首语:本文由编程笔记#小编为大家整理,主要介绍了科学计算基础软件包NumPy入门讲座:常用函数相关的知识,希望对你有一定的参考价值。



文章目录


  • 1. 特殊值
  • 2. 函数命名空间
  • 3. 数学函数
  • 4. 统计函数
  • 5. 插值函数
  • 6. 多项式拟合函数
  • 7. 自定义广播函数
    • 7.1.使用np.frompyfunc定义广播函数
    • 7.2 使用np.vectorize定义广播函数



1. 特殊值

NumPy有两个很有趣的特殊值,np.nan 和 np.inf。nan 是 not a number 的简写,意为不是数字,inf 是 infinity 的简写,意为无穷大。np.nan 也可以写作 np.Nan、np.NaN 或者 np.NAN,np.inf 也可以写作 np.Inf 或 np.Infinity。

先在IDLE里面看看它们的真实面貌。

>>> a = np.array([1, 2, np.nan, np.inf])
>>> a.dtype
dtype('float64')
>>> a[0] = np.nan
>>> a[1] = np.inf
>>> a
array([nan, inf, nan, inf])
>>> a[0] == a[2] # 两个np.nan不相等
False
>>> a[1] == a[3] # 两个np.inf则相等
True
>>> np.isnan(a[0]) # 判断一个数字是否是np.nan
True
>>> np.isinf(a[1]) # 判断一个数字是否是np.inf
True

NumPy 用特殊值来表示缺值、空值和无效值。想一想,Python 和 C 语言如何表示数组中的缺值、空值和无效值呢?Python 因为数组元素不受类型限制,可以用 None 或者 False 等表示缺值、空值和无效值。对 C 语言来说,恐怕也只能在数据的值域范围之外,选一个特定值来表示吧?比如,假定数组存储的是学生的成绩,成绩一般都是正值,所以C语言可以用-1表示缺考。在NumPy数组中,因为有了nan和inf这两个特殊值,我们就不用在意数据的值域范围了。说到这里,你也会问,这两个特殊值,一个不是数字,一个无穷大,数组运算的时候怎么处理呢?这就是NumPy神奇的地方,我们根本不用担心这个问题。下面的代码,演示了在数组相邻的两个元素之间插入它们的算术平均值——尽管数组元素包含 np.nan,但这并不影响数值计算。

>>> a = np.array([9, 3, np.nan, 5, 3])
>>> a = np.repeat(a,2)[:-1]
>>> a[1::2] += (a[2::2]-a[1::2])/2
>>> a
array([ 9., 6., 3., nan, nan, nan, 5., 4., 3.])

2. 函数命名空间

刚开始使用NumPy函数的时候,你一定会有这样的困惑:


  • 都是求和、求极值,下面这两种写法有什么区别吗?

    >>> a = np.random.random(10)
    >>> a.max(), np.max(a)
    (0.8975052328686041, 0.8975052328686041)
    >>> a.sum(), np.sum(a)
    (5.255303938070831, 5.255303938070831)

  • 同样是复制,为什么深复制 copy() 两种写法都行,而浅复制 view() 则只有数组的方法?

    >>> a = np.random.random(10)
    >>> a.copy()
    array([0.14712593, 0.05692805, 0.41679214, 0.62755199, 0.58272166,
    0.88131178, 0.26184716, 0.30175671, 0.78588028, 0.50557561])
    >>> np.copy(a)
    array([0.14712593, 0.05692805, 0.41679214, 0.62755199, 0.58272166,
    0.88131178, 0.26184716, 0.30175671, 0.78588028, 0.50557561])
    >>> a.view()
    array([0.14712593, 0.05692805, 0.41679214, 0.62755199, 0.58272166,
    0.88131178, 0.26184716, 0.30175671, 0.78588028, 0.50557561])
    >>> np.view(a)
    Traceback (most recent call last):
    File "", line 1, in <module>
    np.view(a)
    AttributeError: module &#39;numpy&#39; has no attribute &#39;view&#39;

  • 为什么 where() 不能作为数组 ndarray 的函数&#xff0c;而必须作为 NumPy 的函数&#xff1f;

    >>> np.where(a>0.5)
    (array([3, 4, 5, 8, 9], dtype&#61;int64),)
    >>> a.where(a>0.5)
    Traceback (most recent call last):
    File "", line 1, in <module>
    a.where(a>0.5)
    AttributeError: &#39;numpy.ndarray&#39; object has no attribute &#39;where&#39;

以上这些差异&#xff0c;取决于函数在不同的的命名空间是否有映射。数组的大部分函数在顶层命名空间有映射&#xff0c;因此可以有两种用法。数组的一小部分函数&#xff0c;没有映射到顶层命名空间&#xff0c;只能有一种用法。而顶层命名空间的大部分函数&#xff0c;也都只有一种用法。下表是我整理出来的常用方法的和命名空间的关系&#xff0c;仅供参考。


顶层命名空间和数组对象均支持仅数组对象均支持仅顶层命名空间支持
np/ndarray.any()/all()ndarray.astype()np.where()
np/ndarray.max()/min()ndarray.fill()np.stack()
np/ndarray.argsort()ndarray.view()np.rollaxis()
np/ndarray.mean()ndarray.tolist()np.sin()
… …… …… …

3. 数学函数

如果不熟悉 NumPy&#xff0c;Python 程序员一般都选择使用 math 模块来应对数学问题。从现在开始&#xff0c;我们可以放弃 math 模块了&#xff0c;因为 NumPy 的数学函数比 math 的更方便。我把这两个模块的数学函数整理了一下&#xff0c;分成5类&#xff0c;汇总在这里。其他诸如求和、求差、求积的函数&#xff0c;我把它们归类到统计函数。


  1. 数学常数
  2. 舍入函数
  3. 快速转换函数
  4. 幂函数、指数函数和对数函数
  5. 部分三角函数。

NumPy函数math函数功能
np.emath.e自然常数
np.pimath.pi圆周率
np.ceil()math.ceil()进尾取整
np.floor()nath.floor去尾取整
np.around()四舍五入到指定精度
np.rint()四舍五入到最近整数
np.deg2rad()/radians()math.radians度转弧度
np.rad2deg()/degrees()math.degrees()弧度转度
np.hypot()math.hypot()计算直角三角形的斜边
np.square()平方
np.sqrt()math.sqrt()开平方
np.power()math.pow()
np.exp()math.exp()指数
np.log()/log10()/log2()math.log()/log10()/log2()对数
np.sin()/arcsin()math.sin()/asin()正弦/反正弦
np.cos()/arccos()math.cos()/acos()余弦/反余弦
np.tan()/arctan()math.tan()/atan()正切/反正切

下面&#xff0c;我们一起来试用一下这些常用数学函数。

>>> import numpy as np
>>> import math
>>> math.e &#61;&#61; np.e # 两个模块的自然常数相等&#xff01;
True
>>> math.pi &#61;&#61; np.pi # 两个模块的圆周率相等&#xff01;
True
>>> np.ceil(5.3)
6.0
>>> np.ceil(-5.3)
-5.0
>>> np.floor(5.8)
5.0
>>> np.floor(-5.8)
-6.0
>>> np.around(5.87, 1)
5.9
>>> np.rint(5.87)
6.0
>>> np.degrees(np.pi/2)
90.0
>>> np.radians(180)
3.141592653589793
>>> np.hypot(3,4) # 求平面上任意两点的距离
5.0
>>> np.power(3,1/2)
1.7320508075688772
>>> np.log2(1024)
10.0
>>> np.exp(1)
2.718281828459045
>>> np.sin(np.radians(30)) #正弦、余弦函数的周期是2pi
0.49999999999999994
>>> np.sin(np.radians(150))
0.49999999999999994
>>> np.degrees(np.arcsin(0.5)) # 反正弦、反余弦函数的周期则是pi
30.000000000000004

刚才咱们演示的时候&#xff0c;使用的函数参数都是单一的数值&#xff0c;实际上&#xff0c;这些函数都可以用到NumPy数组上。比如&#xff0c;平面直角坐标系中&#xff0c;有1000万个点&#xff0c;x坐标和y坐标都是分布在[0,1)&#xff0c;哪一个点距离点(0.5,0.5)最近呢&#xff1f;

>>> p &#61; np.random.random((10000000,2))
>>> x, y &#61; np.hsplit(p,2)
>>> d &#61; np.hypot(x-0.5,y-0.5)
>>> i &#61; np.argmin(d)
>>> print(&#39;距离(0.5,0.5)最近的点坐标是(%f,%f)&#xff0c;距离%f&#39;%(p[i][0], p[i][1], d[i]))
距离(0.5,0.5)最近的点坐标是(0.499855,0.499877)&#xff0c;距离0.000190

4. 统计函数

NumPy 的统计函数有很多&#xff0c;我整理了一下&#xff0c;大约可以分成4类&#xff1a;


  1. 查找特殊值
  2. 求和差积
  3. 均值和方差
  4. 相关系数

函数功能
np.max/min(a, axis&#61;None)
np.nanmax/nanmin(a, axis&#61;None)
返回数组中的最大值/最小值
忽略nan返回数组中的最大值/最小值
np.argmax/argmin(a, axis&#61;None)
np.nanargmax/nanargmin(a, axis&#61;None)
返回数组中最大值和最小值的索引
忽略nan返回数组中最大值和最小值的索引
np.ptp(a, axis&#61;None)返回数组中元素最大值与最小值的差
np.median(a, axis&#61;None)
np.nanmedian(a, axis&#61;None)
返回数组元素的中位数
忽略nan返回数组元素的中位数
np.sum(a, axis&#61;None)
np.nansum(a, axis&#61;None)
按指定的轴求元素之和
忽略nan按指定的轴求元素之和
np.cumsum(a, axis&#61;None)
np.nancumsum(a, axis&#61;None)
按指定的轴求元素的累进和
忽略nan按指定的轴求元素的累进和
np.diff(a, axis&#61;-1)按指定的轴返回相邻元素的差
np.prod(a, axis&#61;None)
np.nanprod(a, axis&#61;None)
按指定的轴求元素之积
忽略nan按指定的轴求元素之积
np.mean(a, axis&#61;None)
np.nanmean(a, axis&#61;None)
按指定的轴返回元素的算数平均值
忽略nan按指定的轴返回元素的算数平均值
np.average()根据权重数据&#xff0c;返回数据数组所有元素的加权平均值
np.var(a)
np.nanvar(a)
返回数组方差
忽略nan返回数组方差
np.std()
np.nanstd()
返回数组标准差
忽略nan返回数组标准差
np.corrcoef(a, b)返回两个数组的皮尔逊积矩相关系数

我们先以求最大最小值为例&#xff0c;演示一下忽略 nan 的必要性&#xff1a;

>>> a &#61; np.random.random(10)
>>> np.max(a), np.min(a)
(0.9690291560970601, 0.19240165472992765)
>>> a[1::2] &#61; np.nan
>>> a
array([0.80138474, nan, 0.8615121 , nan, 0.19240165,
nan, 0.61915229, nan, 0.96902916, nan])
>>> np.max(a), np.min(a) # 此时&#xff0c;min()和max()失效了
(nan, nan)
>>> np.nanmax(a), np.nanmin(a) # 必须使用nanmax()和nanmin()
(0.9690291560970601, 0.19240165472992765)

统计学上&#xff0c;方差和标准差使用比较频繁&#xff0c;我们来演示一下&#xff1a;

>>> a &#61; np.random.randint(0,50,(3,4))
>>> np.sum(np.square(a-a.mean()))/a.size # 用方差定义就方差
238.25
>>> np.var(a) # 用方差函数求方差&#xff0c;结果相同
238.25
>>> np.sqrt(a.var()) # 对方差开方&#xff0c;即是标准差
15.435349040433131
>>> a.std() # 用标准差函数求标准差&#xff0c;结果相同
15.435349040433131

最后&#xff0c;我们综合运用统计函数&#xff0c;分析两只股票的关联关系和收益率。pa 和 pb 是两只股票连续30个交易日的股价数组。每日股价收益率定义为当日股价与前一个交易日股价差除以最后一个交易日的股价。

>>> pa &#61; np.array([79.66, 81.29, 80.37, 79.31, 79.84, 78.53, 78.29, 78.51, 77.99, 79.82, 80.41, 79.27, 80.26, 81.61, 81.39, 80.29, 80.18, 78.38, 75.06, 76.15, 75.66, 73.90, 72.14, 74.27, 75.27, 76.15, 75.40, 76.51, 77.57, 77.06])
>>> pb &#61; np.array([30.93, 31.61, 31.62, 31.77, 32.01, 31.52, 30.09, 30.54, 30.78, 30.84, 30.80, 30.38, 30.88, 31.38, 31.05, 29.90, 29.96, 29.59, 28.71, 28.95, 29.19, 28.71, 27.93, 28.35, 28.92, 29.17, 29.02, 29.43, 29.12, 29.11])
>>> np.corrcoef(pa, pb) # 两只股票的相关系数为0.867&#xff0c;关联比较密切
array([[1. , 0.86746674],
[0.86746674, 1. ]])
>>> pa_re&#61;np.diff(pa)/pa[:-1]
>>> pb_re&#61;np.diff(pb)/pb[:-1]
>>> import matplotlib.pyplot as plt
>>> plt.plot(pa_re)
[<matplotlib.lines.Line2D object at 0x000002262AEBD9C8>]
>>> plt.plot(pb_re)
[<matplotlib.lines.Line2D object at 0x000002262BB96408>]
>>> plt.show()

两只股票的收益率变化曲线如下图所示&#xff1a;


5. 插值函数

数据插值是数据处理过程中经常用到的技术&#xff0c;常用的插值有一维插值、二维插值、高阶插值等&#xff0c;常见的算法有线性插值、B样条插值、临近插值等。不过&#xff0c;NumPy只提供了一个简单的一维线性插值函数 np.interp()&#xff0c;其他更加复杂的插值功能放到了SciPy中。

下面用一个实例来演示NumPy一维线性插值函数的使用方法。假定_x和_y是原始的样本点x坐标和y坐标构成的数组&#xff0c;总数只有11个点。如果想在_x的值域范围内插值更多的点&#xff0c;如增加到33个点&#xff0c;就需要在_x的值域范围内生成33个点的 x坐标构成的数组x&#xff0c;再利用插值函数np.interp()得到对应的33个点的y坐标构成的数组y。

>>> import matplotlib.pyplot as plt
>>> _x &#61; np.linspace(0, 2*np.pi, 11)
>>> _y &#61; np.sin(_x)
>>> x &#61; np.linspace(0, 2*np.pi, 33)
>>> y &#61; np.interp(x, _x, _y)
>>> plt.plot(x, y, &#39;o&#39;)
[<matplotlib.lines.Line2D object at 0x0000020A2A8D1048>]
>>> plt.plot(_x, _y, &#39;o&#39;)
[<matplotlib.lines.Line2D object at 0x0000020A2A5ED148>]
>>> plt.show()

下图中橘黄色&#xff08;浅色&#xff09;的点是原始样本点&#xff0c;蓝色&#xff08;深色&#xff09;的点是进行一维线性插值后的点。


6. 多项式拟合函数

拟合与插值看起来有一些相似&#xff0c;所以初学者比较容易混淆&#xff0c;实际上二者是完全不同的概念。拟合又称回归&#xff0c;是指已知某函数的若干离散函数值&#xff0c;通过调整该函数中若干待定系数&#xff0c;使得该函数与已知离散函数值的误差达到最小。

多项式拟合是最常见的拟合方法。对函数




f


(


x


)



f(x)


f(x)
&#xff0c;我们可以使用一个




k



k


k
阶多项式去近似。






f


(


x


)





g


(


x


)


&#61;



a


0



&#43;



a


1



x


&#43;



a


2




x


2



&#43;



a


3




x


3



&#43;


.


.


.


&#43;



a


k




x


k




f(x) \\approx g(x) &#61; a_0 &#43; a_1x &#43; a_2x^2 &#43; a_3x^3 &#43; ... &#43; a_kx^k


f(x)g(x)&#61;a0&#43;a1x&#43;a2x2&#43;a3x3&#43;...&#43;akxk

推荐阅读
  • 本文介绍了在处理不规则数据时如何使用Python自动提取文本中的时间日期,包括使用dateutil.parser模块统一日期字符串格式和使用datefinder模块提取日期。同时,还介绍了一段使用正则表达式的代码,可以支持中文日期和一些特殊的时间识别,例如'2012年12月12日'、'3小时前'、'在2012/12/13哈哈'等。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文介绍了利用ARMA模型对平稳非白噪声序列进行建模的步骤及代码实现。首先对观察值序列进行样本自相关系数和样本偏自相关系数的计算,然后根据这些系数的性质选择适当的ARMA模型进行拟合,并估计模型中的位置参数。接着进行模型的有效性检验,如果不通过则重新选择模型再拟合,如果通过则进行模型优化。最后利用拟合模型预测序列的未来走势。文章还介绍了绘制时序图、平稳性检验、白噪声检验、确定ARMA阶数和预测未来走势的代码实现。 ... [详细]
  • Introduction(简介)Forbeingapowerfulobject-orientedprogramminglanguage,Cisuseda ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Android JSON基础,音视频开发进阶指南目录
    Array里面的对象数据是有序的,json字符串最外层是方括号的,方括号:[]解析jsonArray代码try{json字符串最外层是 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • Python爬虫中使用正则表达式的方法和注意事项
    本文介绍了在Python爬虫中使用正则表达式的方法和注意事项。首先解释了爬虫的四个主要步骤,并强调了正则表达式在数据处理中的重要性。然后详细介绍了正则表达式的概念和用法,包括检索、替换和过滤文本的功能。同时提到了re模块是Python内置的用于处理正则表达式的模块,并给出了使用正则表达式时需要注意的特殊字符转义和原始字符串的用法。通过本文的学习,读者可以掌握在Python爬虫中使用正则表达式的技巧和方法。 ... [详细]
  • Whatsthedifferencebetweento_aandto_ary?to_a和to_ary有什么区别? ... [详细]
  • 本文介绍了一个Python函数same_set,用于判断两个相等长度的数组是否包含相同的元素。函数会忽略元素的顺序和重复次数,如果两个数组包含相同的元素,则返回1,否则返回0。文章还提供了函数的具体实现代码和样例输入输出。 ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • 本文介绍了使用PHP实现断点续传乱序合并文件的方法和源码。由于网络原因,文件需要分割成多个部分发送,因此无法按顺序接收。文章中提供了merge2.php的源码,通过使用shuffle函数打乱文件读取顺序,实现了乱序合并文件的功能。同时,还介绍了filesize、glob、unlink、fopen等相关函数的使用。阅读本文可以了解如何使用PHP实现断点续传乱序合并文件的具体步骤。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 颜色迁移(reinhard VS welsh)
    不要谈什么天分,运气,你需要的是一个截稿日,以及一个不交稿就能打爆你狗头的人,然后你就会被自己的才华吓到。------ ... [详细]
author-avatar
倾听雨2502862143
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有